package com.itzmn.newcode.offer1;

import java.util.Stack;

/**
 * @Author: 张梦楠
 * @Date: 2018/12/20 14:20
 * 简书：https://www.jianshu.com/u/d611be10d1a6
 * 码云：https://gitee.com/zhangqiye
 * @Description: 栈的压入弹出序列
 *
 *  输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否可能为该栈的弹出顺序。
 *  假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序，序列4,5,3,2,1
 *  是该压栈序列对应的一个弹出序列，但4,3,5,1,2就不可能是该压栈序列的弹出序列。（注意：这两个序列的长度是相等的）
 *
 *  思路：栈是先入后出的。
 *  模拟栈，操作数据
 *
 */
public class _21_PushInPopUpSequence {

    public static void main(String[] args) {

        new _21_PushInPopUpSequence().test();
    }

    private void test() {
        boolean b = IsPopOrder(new int[]{1, 2, 3, 4, 5}, new int[]{4, 5, 3, 2, 1});
        System.out.println(b);
    }
    public boolean IsPopOrder(int [] pushA,int [] popA) {

        Stack<Integer> stack = new Stack<>();

        for (int i=0,j=0;i<pushA.length;i++){
            stack.push(pushA[i]);
            // 如果栈添加的数据和弹出的数据相同，则将数据弹出
            while (j<popA.length && stack.peek() == popA[j]){
                stack.pop();
                j++;
            }
        }
        if (stack.isEmpty()){
            return true;
        }
        return false;
    }

}
